在本地端開發郵件寄送程式的時候,如果沒有 SMTP 伺服器時,可以先用 Gmail 的外寄郵件(SMTP)伺服器,來進行郵件的寄送。Laravel 4 使用 Swift Mailer 套件處理發送作業,如果需要更進階的郵件寄送規則,可以參考官方 API 文件,自行進行程式的擴充。
環境確認
因為是透過安全連線請求發送郵件,所以必需確認 PHP 的 openssl 是否已經啟用。可以從 phpinfo 得到相關訊息如下圖,如果沒有出現就表示沒有正確啟用,請修改 php.ini 進行啟用,若仍然有問題,可能需要檢查 log 記錄檔來排除。
郵件設定檔
Laravel 針對郵件部分的設定檔位於 app/config/email.php
檔案中,大致上的設定檔內容如下(為了簡潔移除註解部分),僅對特別部分進行說明:
<?php
return array(
'driver' => 'smtp',
'host' => 'smtp.gmail.com',
'port' => 465,
'from' => array(
'address' => 'yourAccount@gmail.com',
'name' => 'Your Name Or Compnay Name',
),
'encryption' => 'ssl',
'username' => 'yourAccount@gmail.com',
'password' => 'zvthqxblhekeqvqo',
'sendmail' => '/usr/sbin/sendmail -bs',
'pretend' => false,
);
Gmail 提供了兩種連線方式來寄送郵件。分別是 TLS(port:587) 與 SSL(port:465) ,所以請依照需求,各別設定對應的 port
與 encryption
兩個參數。
在 password
部分,如果你已經申請了 Google 的手機驗證登入方法(也就是你登入 Gmail 需要輸入 Google 發送給你的簡訊碼),這時候就不能使用一般登入 Gmail 的密碼,而是使用透過 Google 產生的 應用程式專用密碼。我們可以從 個人帳戶頁面»安全性»已連結的應用程式和網站 來建立一組新密碼。
Google 系統將產生一組密碼如下圖。雖然顯示的時候,每四個字母有一個空白,但在使用的時候,請忽略空白的部分。
最後,記得將 pretend
參數設定為 false ,否則 Laravel 不會呼叫 SwiftMail 進行寄送,而是將郵件內容寫到應用程式的 log 檔案來進行模擬。
郵件發送測試
這邊我們直接在路由 app/routes.php
寫個簡易的郵件寄送程式範例如下:
<?php
Route::get('gmail_test', function()
{
// 為了測試,我們將寄送給自己
$address = Config::get('email.username');
// 系統會將資料變數 $data 套用到視圖 `app/views/emails/auth/test.blade.php`中後發送
$data = array('token' => '123456');
Mail::send('emails.auth.reminder', $data, function($message) use ($address)
{
// $message 是一個 SwiftMailer 物件,你可以呼叫在 SwiftMailer 類別中
// 的任何方法去來設定此封郵件
$message->to($address)->subject('Laravel Mail By Gmail');
});
});
感謝 Kejyun 提醒如果在匿名函式要使用外部的變數,必需使用 use() 這個方法,注意必需在版本 5.3 後才支援,詳細可以參考 PHP 官方說明] (2013-08-25 補記)
接著我們在瀏覽器輸入 http://127.0.0.1/your-laravel/public/gmail_test
測試發送。如果寄送成功,就可以收到一封透過 Gmail 送給自己的郵件。